package checker;

import util.AST.Comand;
import util.AST.Program;
import util.AST.AsgComd.AsgComdExp;
import util.AST.AsgComd.AsgComdFuncCall;
import util.AST.Declarations.FunctionDeclaration;
import util.AST.Declarations.ProcedureDeclaration;
import util.AST.Declarations.VarDeclaration;
import util.AST.Expression.BinaryExpression;
import util.AST.Expression.BooleanUnaryExpression;
import util.AST.Expression.Expression;
import util.AST.Expression.IdUnaryExpression;
import util.AST.Expression.NumberUnaryExpression;
import util.AST.Statement.AssignStatement;
import util.AST.Statement.ExitStatement;
import util.AST.Statement.FunctionCallStatement;
import util.AST.Statement.IfElseStatement;
import util.AST.Statement.PutLineStatement;
import util.AST.Statement.ReturnStatement;
import util.AST.Statement.WhileStatement;
import util.AST.Terminal.Boolean;
import util.AST.Terminal.ID;
import util.AST.Terminal.Number;
import util.AST.Terminal.Operator;
import util.AST.Terminal.Tipo;

public interface Visitor {
		
		public Object visitProgram(Program p, Object o) throws SemanticException;
		public Object visitComand (Comand c, Object o) throws SemanticException;
        public Object visitFunctionDeclaration(FunctionDeclaration fd, Object o) throws SemanticException;
        public Object visitProcedureDeclaration(ProcedureDeclaration pd, Object o) throws SemanticException;
        public Object visitVarDeclaration(VarDeclaration vd, Object o) throws SemanticException;
        
        public Object visitAsgComdExp(AsgComdExp ac, Object o) throws SemanticException;
        public Object visitAsgFuncCall(AsgComdFuncCall ac, Object o) throws SemanticException;
        
        public Object visitBinaryExpression(BinaryExpression be, Object o) throws SemanticException;
        public Object visitIdUnaryExpression(IdUnaryExpression iue, Object o) throws SemanticException;
        public Object visitNumberUnaryExpression(NumberUnaryExpression nue, Object o) throws SemanticException;
        public Object visitBooleanUnaryExpression(BooleanUnaryExpression un, Object o) throws SemanticException;
        
        public Object visitAssignStatement(AssignStatement as, Object o) throws SemanticException;
        public Object visitExitStatement(ExitStatement es, Object o) throws SemanticException;
        public Object visitFunctionCallStatement(FunctionCallStatement fcs, Object o) throws SemanticException;
        public Object visitIfElseStatement(IfElseStatement ies, Object o) throws SemanticException;
        public Object visitPutLineStatement(PutLineStatement pls, Object o) throws SemanticException;
        public Object visitReturn(ReturnStatement rs, Object o) throws SemanticException;
        public Object visitWhileStatement(WhileStatement ws, Object o) throws SemanticException;
        
        public Object visitID(ID id, Object o) throws SemanticException;
        public Object visitNumber(Number n, Object o) throws SemanticException;
        public Object visitBoolean(Boolean b, Object o) throws SemanticException;
        public Object visitOperator(Operator op, Object o) throws SemanticException;
        public Object visitTipo(Tipo t, Object o) throws SemanticException;
}

